#ifndef __APP_NVS_H__
#define __APP_NVS_H__

#include <stdint.h>

#include "app_wifi.h"
#include "app_mqtt.h"
#include "app_iot_ctrl.h"
#include "app_ota.h"

#ifdef __cplusplus
extern "C" {
#endif

#define APP_NVS_NAMESPACE           "storage"       /**< nvs 命名空间 */

#define APP_NVS_KEY_WIFI_STA_INFO   "sta_info"      /**< Wi-Fi STA 信息 键名 */
#define APP_NVS_KEY_WIFI_MODE       "wifi_mode"     /**< Wi-Fi 模式 键名 */
#define APP_NVS_KEY_MQTT_CFG        "mqtt_cfg"      /**< MQTT 配置 键名 */
#define APP_NVS_KEY_MQTT_TOPIC      "mqtt_topic"    /**< MQTT 主题 键名 */
#define APP_NVS_KEY_DEVICE_STATE    "device_state"  /**< 设备状态 键名 */
#define APP_NVS_KEY_OTA_CFG         "ota_cfg"       /**< OTA 配置 键名 */
#define APP_NVS_KEY_OTA_SERVER_CFG  "ota_server_cfg"/**< OTA 服务器配置 键名 */

/**
 * @brief 保存wifi sta信息
 * @details 保存wifi sta信息
 * @param wifi_info 指向app_wifi_info_t结构体的指针
 * @return 成功返回 0，失败返回负值
 */
int app_nvs_save_wifi_sta_info(app_wifi_info_t *wifi_info);

/**
 * @brief 获取wifi模式
 * @details 获取wifi模式
 * @param mode 指向hal_wifi_mode_t结构体的指针
 * @return 成功返回 0，失败返回负值
 */
int app_nvs_get_wifi_mode(hal_wifi_mode_t *mode);

/**
 * @brief 保存wifi模式
 * @details 保存wifi模式
 * @param mode hal_wifi_mode_t结构体
 * @return 成功返回 0，失败返回负值
 */
int app_nvs_save_wifi_mode(hal_wifi_mode_t mode);

/**
 * @brief 保存mqtt配置
 * @details 保存mqtt配置
 * @param mqtt_cfg 指向app_mqtt_cfg_t结构体的指针
 * @return 成功返回 0，失败返回负值
 */
int app_nvs_save_mqtt_cfg(app_mqtt_cfg_t *mqtt_cfg);

/**
 * @brief 保存mqtt主题
 * @details 保存mqtt主题
 * @param mqtt_topic 指向app_mqtt_topic_t结构体的指针
 * @return 成功返回 0，失败返回负值
 */
int app_nvs_save_mqtt_topic(app_mqtt_topic_t *mqtt_topic);

/**
 * @brief 获取ota配置
 * @details 获取ota配置
 * @param ota_cfg 指向app_ota_config_t结构体的指针
 * @return 成功返回 0，失败返回负值
 */
int app_nvs_get_ota_cfg(app_ota_config_t *ota_cfg);

/**
 * @brief 保存ota配置
 * @details 保存ota配置
 * @param ota_cfg 指向app_ota_config_t结构体的指针
 * @return 成功返回 0，失败返回负值
 */
int app_nvs_save_ota_cfg(app_ota_config_t *ota_cfg);

/**
 * @brief 获取ota服务器配置
 * @details 获取ota服务器配置
 * @param ota_server_cfg 指向app_ota_server_config_t结构体的指针
 * @return 成功返回 0，失败返回负值
 */
int app_nvs_get_ota_server_cfg(app_ota_server_config_t *ota_server_cfg);

/**
 * @brief 保存ota服务器配置
 * @details 保存ota服务器配置
 * @param ota_server_cfg 指向app_ota_server_config_t结构体的指针
 * @return 成功返回 0，失败返回负值
 */
int app_nvs_save_ota_server_cfg(app_ota_server_config_t *ota_server_cfg);

/**
 * @brief 获取设备状态
 * @details 获取设备状态
 * @param device_state 指向app_iot_device_state_t结构体的指针
 * @return 成功返回 0，失败返回负值
 */
int app_nvs_get_device_state(app_iot_device_state_t *device_state);

/**
 * @brief 保存设备状态
 * @details 保存设备状态
 * @param device_state 指向app_iot_device_state_t结构体的指针
 * @return 成功返回 0，失败返回负值
 */
int app_nvs_save_device_state(app_iot_device_state_t *device_state);

/**
 * @brief 加载所有配置
 * @details 加载所有配置
 * @return 成功返回 0，失败返回负值
 */
int app_nvs_load_all_cfg(void);

/**
 * @brief 恢复出厂设置
 * @details 恢复出厂设置
 * @return 成功返回 0，失败返回负值
 */
int app_nvs_restore_factory(void);

#ifdef __cplusplus
}
#endif

#endif // __APP_NVS_H__